<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>113_函数_call_apply</title>
		<script>
			/* 
			根据函数调用方式的不同，this的值也不同:
				1.以函数形式调用，this是window;
				2。以方法形式调用，this是调用方法的对象;
				3.构造函数中，this是新建的对象;
				4.箭头函数没有自己的this，由外层作用域决定;
				5.通过call和apply调用的函数，它们的第一个参数就是函数的this;
			 */
			function fn() {
				console.log("函数执行了~", this);
			}
			const obj = {
				name: "孙悟空",
				fn
			}
			/* 
			调用函数除了通过函数()这种形式外，还可以通过其他的方式来调用函数
			比如，我们可以通过调用函数的call()和apply()两个方法来调用函数
				函数.call()
				函数.apply()
				-call 和 apply除了可以调用函数，还可以用来指定函数中的this。
				-call和apply的第一个参数，将会成为函数的this。
				-通过call方法调用函数，函数的实参直接在第一个参数后一个一个的列出来。
				-通过apply方法调用函数，函数的实参需要通过一个数组传递。
			 */
			fn.call(); //不传参数，fn中的this是window
			fn.apply() //不传参数，fn中的this是window

			fn.call(obj) //this变成了obj {name: '孙悟空', fn: ƒ}
			fn.apply(obj) //同上

			fn.apply(console) //console {debug: ƒ, error: ƒ, info: ƒ, log: ƒ, warn: ƒ, …}

			function fn2(a, b) {
				console.log(a, b, this);
			}
			fn2(10, 11); //打印 10 11 Window
			//如果使用call怎么调用fn2？
			fn2.call(obj, "hello", 11)
			fn2.apply(obj,["hello",true])
		</script>
	</head>
	<body>
	</body>
</html>